绕过某大学宿舍设备共享检测
基本原理
利用加密隧道传输可能暴露设备特征的非加密流量
(NTP
/HTTP
/DNS
等) ,
直连443
端口让HTTPS
流量直接流向公网减少服务器带宽消耗,
并降低网页浏览延时.
另外将wan
口出去的流量全部统一TTL
,
从而实现wan
口不包含任何非加密流量且不包含TTL
特征.
为什么不伪装
UA
和IPID
?
HTTP
流量走加密隧道出去了无需伪装; 实测IPID
不在检测范围内, 也不需要.
准备工作
一台可以刷
OpenWrt
的路由器, 最好是官方支持的, 比如Redmi-AC2100
/Redmi-AX6S
.一台落地
VPS
, 地域最好是湖北, 用于和路由器建WireGuard
加密隧道, 转发除HTTPS
以外的流量. 因为流量大部分都来自于HTTPS
, 所以这个机器带宽要求不高, 不下BT
这种基本没啥问题, 如果你恰好财力雄厚可以考虑大带宽服务器.
我用的亿安云, 几块钱一个月, 跑满百兆没问题, NAT机配一下端口映射又不是不能用(
本教程基于最新版OpenWrt-23.05.5
编写,
使用Nfatbles
完成防火墙配置,
旧版使用iptabes
不能直接套用.
配置流程
配置转发服务器
以Ubuntu
为例, SSH
连接上去之后,
编辑/etc/sysctl.conf
, 打开路由转发并重启.
1 | net.ipv4.ip_forward=1 |
安装Wireguard
, 网络问题先换源.
1 | apt update |
配置WireGuard
, 准备wg0.conf
.
私钥用wg genkey
生成, 用wg pubkey
读出公钥,
总共需要两对, 路由器一对, VPS
一对.
文件名决定了
WireGuard
网络接口的名字, 不要改, 另外ens18
需要改为VPS
的出口网卡名.
1 | [Interface |
准备好之后执行wg-quick up ./wg0.conf
启动网络接口,
正常状态类似下图.
某些机器可能需要安装一些依赖, 我这台缺失
openresolv
, 使用apt install openresolv
安装即可.然后再
wg-quick down ./wg0.conf && wg-quick up ./wg0.conf
重启接口.
通过wg show
可以查看接口状态(图中因为接口已经连接,
略有不同), 如果没有显示任何内容说明没生效.
配置路由器环境
建议使用官方版OpenWrt
, 方便进行固件定制,
在重置路由器后可以不用从头安装软件包,
OpenWrt
提供了快捷的固件定制网页.
ImmortalWrt
也可以, 这里以OpenWrt
为例.
需要添加的软件包,
分别是luci
汉化包,iproute2
和wireguard
1 | luci-i18n-base-zh-cn |
修改首次运行脚本, 如图, 在末尾插入, 实现自动换源.
1 | sed -i 's/downloads.openwrt.org/mirrors.ustc.edu.cn\/openwrt/g' /etc/opkg/distfeeds.conf |
也可以修改一下lan_ip_address="192.168.31.1"
,
避免默认192.168.1.1
的lan
地址和其他设备冲突.
然后把固件刷入设备即可, 重置路由器也不用重新安装了.
不采用定制固件方式也可以自己去OpenWrt
后台自己装, 就是麻烦,
效果一样.
配置nftables
SSH
连接到路由器,
在/etc/nftables.d/
下新建user_mangle.nft
文件,
原有文件可以不动, 也可以把以下内容粘贴到原有文件之后, 效果一样.
第一个链将从lan
口来的目的端口为443
的流量打上0x233
标记,
第二个链将所有从wan
口流出的流量的TTL
统一为64
(理论上还需要修改IPv6
的TTL
,
但是他们没提供IPv6
网络, 就先不管了).
1 | chain user_mangle_mark443 { |
配置完成后输入service firewall restart
重启nfatbles
服务.
报语法错误说明编辑时使用了中文回车(CRLF)而不是Unix回车(LF)
WireGuard连接前准备
先认证让路由器通网,
再去lan
口和wan
口的高级设置中把使用默认网关取消勾选,
避免自动添加路由带来的干扰.
配置完路由表应只剩lan
口和wan
口的子网路由,
没有0.0.0.0/0
默认路由, 此时路由器处于断网状态.
配置wan
口DNS
服务器为公网IP
服务器,
比如114
,
因为后续路由器的DNS
流量也全部走加密隧道,
内网DNS
服务器不可用.
在静态路由的main
表中中添加一条wan
路由,
目标是VPS
的IP
,
让连接VPS
的流量走wan
口出去.
在防火墙新建一个vpn
区域,
等下要把WireGuard
的接口添加进这个区域.
lan
区域需要开启mss钳制
,
非常重要,
不开启可能会因为mtu
问题会导致电脑无法联网.
允许lan
侧流量转发至vpn
,
允许vpn
侧流量转发至wan
侧,
并开启vpn
的IP
动态伪装, 设置完效果如图.
编辑防火墙-通信规则, 新增一条Allow-Direct
规则,
允许打上0x233
标记的流量从lan
区域转发到wan
区域.
添加WireGuard接口
填入路由器端的公私钥, 设置IP
. 勾选无主机路由,
那一步在静态路由里配过了, 自动有时候会出问题.
设置MTU
为1280
, 与VPS
保持一致,
取消勾选使用默认网关.
防火墙设置为之前新建的vpn
区域
填入VPS
的公钥,
设置允许IP
为0.0.0.0/0
,
端点IP
为VPS
的IP
,
端口填VPS
的监听端口.
如果是公网
IP
的VPS
, 那么这个端口应该与wg0.conf
里的监听端口一致为25053
我这里用的是
NAT
主机, 端口号为自己映射的外网端口
设置完成后可以在 状态-Wireguard
里查看连接情况,
如果上次握手时间正常的话说明连接成功.
配置路由
编辑/etc/iproute2/rt_tables
,
添加一张新的路由表direct
, 序号为50
,
用于路由直连流量.
1 | #添加完类似这样 |
添加两条新的路由
main
表的0.0.0.0/0
默认路由, 用于转发本机所有流量至vpn
, 通过vpn
接口发往10.0.0.1
网关, 这个路由添加完成后路由器和下面的设备就可以联网了, 此时所有流量均通过VPS
转发.direct
表的0.0.0.0/0
默认路由, 用于将直连流量通过wan
口发出, 此时direct
表不起作用, 还需要添加路由规则, 让带有0x233
标记的流量去查询这张路由表.
添加IPv4
路由规则, 设置优先级为50
,
表为direct
,
在高级设置里匹配防火墙标志0x233
.
此时所有配置已完成, 443
端口也直连外网了.
附上路由表/规则/Nfatbles
/接口配置参照.
后记
这个方案理论上还有可以改进的地方, 不过我没有再去尝试了, 喜欢折腾的可以试试.
- 把服务器的
IPv6
地址分配到本机使用 - 开放除
443
外的其它端口